home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 / Ham Radio 2000.iso / ham2000 / misc / dspice0s / acsol.c < prev    next >
C/C++ Source or Header  |  1992-11-21  |  8KB  |  232 lines

  1. /* acsol.f -- translated by f2c (version of 3 February 1990  3:36:42).
  2.    You must link the resulting object file with the libraries:
  3.     -lF77 -lI77 -lm -lc   (in that order)
  4. */
  5.  
  6. #include "f2c.h"
  7.  
  8. /* Common Block Declarations */
  9.  
  10. struct {
  11.     integer ielmnt, isbckt, nsbckt, iunsat, nunsat, itemps, numtem, isens, 
  12.         nsens, ifour, nfour, ifield, icode, idelim, icolum, insize, 
  13.         junode, lsbkpt, numbkp, iorder, jmnode, iur, iuc, ilc, ilr, 
  14.         numoff, isr, nmoffc, iseq, iseq1, neqn, nodevs, ndiag, iswap, 
  15.         iequa, macins, lvnim1, lx0, lvn, lynl, lyu, lyl, lx1, lx2, lx3, 
  16.         lx4, lx5, lx6, lx7, ld0, ld1, ltd, imynl, imvn, lcvn, nsnod, 
  17.         nsmat, nsval, icnod, icmat, icval, loutpt, lpol, lzer, irswpf, 
  18.         irswpr, icswpf, icswpr, irpt, jcpt, irowno, jcolno, nttbr, nttar, 
  19.         lvntmp;
  20. } tabinf_;
  21.  
  22. #define tabinf_1 tabinf_
  23.  
  24. struct {
  25.     integer locate[50], jelcnt[50], nunods, ncnods, numnod, nstop, nut, nlt, 
  26.         nxtrm, ndist, ntlin, ibr, numvs, numalt, numcyc;
  27. } cirdat_;
  28.  
  29. #define cirdat_1 cirdat_
  30.  
  31. struct {
  32.     doublereal value[200000];
  33. } blank_;
  34.  
  35. #define blank_1 blank_
  36.  
  37. /*<       subroutine acsol >*/
  38. /* Subroutine */ int acsol_()
  39. {
  40.     /* System generated locals */
  41.     integer i_1, i_2;
  42.     doublereal d_1, d_2;
  43.     complex q_1;
  44.  
  45.     /* Local variables */
  46.     extern /* Subroutine */ int cdiv_();
  47.     static integer iord, jord;
  48.     extern /* Subroutine */ int copy8_();
  49.     static integer i, j, k;
  50.     static doublereal ximag;
  51.     static integer locnn;
  52.     static doublereal xreal;
  53.     extern /* Subroutine */ int cmult_();
  54.     extern integer indxx_();
  55. #define nodplc ((integer *)&blank_1)
  56. #define cvalue ((complex *)&blank_1)
  57.     static integer loc;
  58.  
  59. /*<       implicit double precision (a-h,o-z) >*/
  60.  
  61. /*     this routine solves the circuit equations by performing a forward 
  62. */
  63. /* and backward substitution using the previously-computed lu factors. */
  64.  
  65. /* spice version 2g.6  sccsid=tabinf 3/15/83 */
  66. /*<       common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, >*/
  67. /*<      1   isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, >*/
  68. /*<      2   junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, >*/
  69. /*<      3   nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, >*/
  70. /*<      4   lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, >*/
  71. /*<      5   imynl,imvn,lcvn,nsnod,nsmat,nsval,icnod,icmat,icval, >*/
  72. /*<      6   loutpt,lpol,lzer,irswpf,irswpr,icswpf,icswpr,irpt,jcpt, >*/
  73. /*<      7   irowno,jcolno,nttbr,nttar,lvntmp >*/
  74. /* spice version 2g.6  sccsid=cirdat 3/15/83 */
  75. /*<       common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop, >*/
  76. /*<      1   nut,nlt,nxtrm,ndist,ntlin,ibr,numvs,numalt,numcyc >*/
  77. /* spice version 2g.6  sccsid=blank 3/15/83 */
  78. /*<       common /blank/ value(200000) >*/
  79. /*<       integer nodplc(64) >*/
  80. /*<       complex cvalue(32) >*/
  81. /*<       equivalence (value(1),nodplc(1),cvalue(1)) >*/
  82.  
  83. /*  forward substitution */
  84.  
  85. /*<       do 20 i=2,nstop >*/
  86.     i_1 = cirdat_1.nstop;
  87.     for (i = 2; i <= i_1; ++i) {
  88. /*<       loc=i >*/
  89.     loc = i;
  90. /*<       iord=nodplc(irswpf+i) >*/
  91.     iord = nodplc[tabinf_1.irswpf + i - 1];
  92. /*<    10 loc=nodplc(jcpt+loc) >*/
  93. L10:
  94.     loc = nodplc[tabinf_1.jcpt + loc - 1];
  95. /*<       if (nodplc(jcolno+loc).ge.i) go to 20 >*/
  96.     if (nodplc[tabinf_1.jcolno + loc - 1] >= i) {
  97.         goto L20;
  98.     }
  99. /*<       j=nodplc(jcolno+loc) >*/
  100.     j = nodplc[tabinf_1.jcolno + loc - 1];
  101. /*<       jord=nodplc(irswpf+j) >*/
  102.     jord = nodplc[tabinf_1.irswpf + j - 1];
  103. /*<       call cmult(value(lynl+loc),value(imynl+loc), >*/
  104. /*<      1     value(lvn+jord),value(imvn+jord),xreal,ximag) >*/
  105.     cmult_(&blank_1.value[tabinf_1.lynl + loc - 1], &blank_1.value[
  106.         tabinf_1.imynl + loc - 1], &blank_1.value[tabinf_1.lvn + jord 
  107.         - 1], &blank_1.value[tabinf_1.imvn + jord - 1], &xreal, &
  108.         ximag);
  109. /*<       value(lvn+iord)=value(lvn+iord)-xreal >*/
  110.     blank_1.value[tabinf_1.lvn + iord - 1] -= xreal;
  111. /*<       value(imvn+iord)=value(imvn+iord)-ximag >*/
  112.     blank_1.value[tabinf_1.imvn + iord - 1] -= ximag;
  113. /*<       go to 10 >*/
  114.     goto L10;
  115. /*<    20 continue >*/
  116. L20:
  117.     ;}
  118.  
  119. /*      back substitution */
  120.  
  121. /*<       i=nstop >*/
  122.     i = cirdat_1.nstop;
  123. /*<       iord=nodplc(irswpf+i) >*/
  124.     iord = nodplc[tabinf_1.irswpf + i - 1];
  125. /*<       jord=nodplc(icswpf+i) >*/
  126.     jord = nodplc[tabinf_1.icswpf + i - 1];
  127. /*<       locnn=indxx(iord,jord) >*/
  128.     locnn = indxx_(&iord, &jord);
  129. /*<    30 call cdiv(value(lvn+iord),value(imvn+iord),value(lynl+locnn), >*/
  130. /*<      1     value(imynl+locnn),value(lvn+iord),value(imvn+iord)) >*/
  131. L30:
  132.     cdiv_(&blank_1.value[tabinf_1.lvn + iord - 1], &blank_1.value[
  133.         tabinf_1.imvn + iord - 1], &blank_1.value[tabinf_1.lynl + locnn - 
  134.         1], &blank_1.value[tabinf_1.imynl + locnn - 1], &blank_1.value[
  135.         tabinf_1.lvn + iord - 1], &blank_1.value[tabinf_1.imvn + iord - 1]
  136.         );
  137. /*<       i=i-1 >*/
  138.     --i;
  139. /*<       if (i.le.1) go to 60 >*/
  140.     if (i <= 1) {
  141.     goto L60;
  142.     }
  143. /*<       iord=nodplc(irswpf+i) >*/
  144.     iord = nodplc[tabinf_1.irswpf + i - 1];
  145. /*<       loc=i >*/
  146.     loc = i;
  147. /*<    35 loc=nodplc(jcpt+loc) >*/
  148. L35:
  149.     loc = nodplc[tabinf_1.jcpt + loc - 1];
  150. /*<    40 if (nodplc(jcolno+loc).ne.i) go to 35 >*/
  151. /* L40: */
  152.     if (nodplc[tabinf_1.jcolno + loc - 1] != i) {
  153.     goto L35;
  154.     }
  155. /*<       locnn=loc >*/
  156.     locnn = loc;
  157. /*<    50 loc=nodplc(jcpt+loc) >*/
  158. L50:
  159.     loc = nodplc[tabinf_1.jcpt + loc - 1];
  160. /*<       if (loc.eq.0) go to 30 >*/
  161.     if (loc == 0) {
  162.     goto L30;
  163.     }
  164. /*<       j=nodplc(jcolno+loc) >*/
  165.     j = nodplc[tabinf_1.jcolno + loc - 1];
  166. /*<       jord=nodplc(irswpf+j) >*/
  167.     jord = nodplc[tabinf_1.irswpf + j - 1];
  168. /*<       call cmult(value(lynl+loc),value(imynl+loc), >*/
  169. /*<      1     value(lvn+jord),value(imvn+jord),xreal,ximag) >*/
  170.     cmult_(&blank_1.value[tabinf_1.lynl + loc - 1], &blank_1.value[
  171.         tabinf_1.imynl + loc - 1], &blank_1.value[tabinf_1.lvn + jord - 1]
  172.         , &blank_1.value[tabinf_1.imvn + jord - 1], &xreal, &ximag);
  173. /*<       value(lvn+iord)=value(lvn+iord)-xreal >*/
  174.     blank_1.value[tabinf_1.lvn + iord - 1] -= xreal;
  175. /*<       value(imvn+iord)=value(imvn+iord)-ximag >*/
  176.     blank_1.value[tabinf_1.imvn + iord - 1] -= ximag;
  177. /*<       go to 50 >*/
  178.     goto L50;
  179.  
  180. /*  reorder solution vector */
  181.  
  182. /*<    60 do 70 i=1,nstop >*/
  183. L60:
  184.     i_1 = cirdat_1.nstop;
  185.     for (i = 1; i <= i_1; ++i) {
  186. /*<       j=nodplc(icswpr+i) >*/
  187.     j = nodplc[tabinf_1.icswpr + i - 1];
  188. /*<       k=nodplc(irswpf+j) >*/
  189.     k = nodplc[tabinf_1.irswpf + j - 1];
  190. /*<       value(ndiag+i)=value(lvn+k) >*/
  191.     blank_1.value[tabinf_1.ndiag + i - 1] = blank_1.value[tabinf_1.lvn + 
  192.         k - 1];
  193. /*<       value(ndiag+i+nstop)=value(imvn+k) >*/
  194.     blank_1.value[tabinf_1.ndiag + i + cirdat_1.nstop - 1] = 
  195.         blank_1.value[tabinf_1.imvn + k - 1];
  196. /*<    70 continue >*/
  197. /* L70: */
  198.     }
  199. /*<       call copy8(value(ndiag+1),value(lvn+1),nstop) >*/
  200.     copy8_(&blank_1.value[tabinf_1.ndiag], &blank_1.value[tabinf_1.lvn], &
  201.         cirdat_1.nstop);
  202. /*<       call copy8(value(ndiag+1+nstop),value(imvn+1),nstop) >*/
  203.     copy8_(&blank_1.value[tabinf_1.ndiag + 1 + cirdat_1.nstop - 1], &
  204.         blank_1.value[tabinf_1.imvn], &cirdat_1.nstop);
  205. /*<       do 120 i=2,nstop >*/
  206.     i_1 = cirdat_1.nstop;
  207.     for (i = 2; i <= i_1; ++i) {
  208. /*<       cvalue(lcvn+i)=cmplx(sngl(value(lvn+i)),sngl(value(imvn+i))) >*/
  209.     i_2 = tabinf_1.lcvn + i - 1;
  210.     d_1 = blank_1.value[tabinf_1.lvn + i - 1];
  211.     d_2 = blank_1.value[tabinf_1.imvn + i - 1];
  212.     q_1.r = d_1, q_1.i = d_2;
  213.     cvalue[i_2].r = q_1.r, cvalue[i_2].i = q_1.i;
  214. /*<   120 continue >*/
  215. /* L120: */
  216.     }
  217. /*<       cvalue(lcvn+1)=cmplx(0.0e0,0.0e0) >*/
  218.     i_1 = tabinf_1.lcvn;
  219.     cvalue[i_1].r = (float)0., cvalue[i_1].i = (float)0.;
  220.  
  221. /*  finished */
  222.  
  223. /*<       return >*/
  224.     return 0;
  225. /*<       end >*/
  226. } /* acsol_ */
  227.  
  228. #undef cvalue
  229. #undef nodplc
  230.  
  231.  
  232.